package com.hunter.sign.common.util.biometrics;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Arrays;

import javax.imageio.stream.FileImageInputStream;
import javax.imageio.stream.FileImageOutputStream;

public class BmpConver {
	//图片到byte数组
	  public static byte[] image2byte(String path){
	    byte[] data = null;
	    FileImageInputStream input = null;
	    try {
	      input = new FileImageInputStream(new File(path));
	      ByteArrayOutputStream output = new ByteArrayOutputStream();
	      byte[] buf = new byte[1024];
	      int numBytesRead = 0;
	      while ((numBytesRead = input.read(buf)) != -1) {
	      output.write(buf, 0, numBytesRead);
	      }
	      data = output.toByteArray();
	      output.close();
	      input.close();
	    }
	    catch (FileNotFoundException ex1) {
	      ex1.printStackTrace();
	    }
	    catch (IOException ex1) {
	      ex1.printStackTrace();
	    }
	    return data;
	  }
	  //byte数组到图片
	  public static void byte2image(byte[] data,String path){
	    if(data.length<3||path.equals("")) return;
	    try{
	    FileImageOutputStream imageOutput = new FileImageOutputStream(new File(path));
	    imageOutput.write(data, 0, data.length);
	    imageOutput.close();
//	    System.out.println("Make Picture success,Please find image in " + path);
	    } catch(Exception ex) {
	      System.out.println("Exception: " + ex);
	      ex.printStackTrace();
	    }
	  }
	  //byte数组到16进制字符串
	  public static String byte2string(byte[] data){
	    if(data==null||data.length<=1) return "0x";
	    if(data.length>200000) return "0x";
	    StringBuffer sb = new StringBuffer();
	    int buf[] = new int[data.length];
	    //byte数组转化成十进制
	    for(int k=0;k<data.length;k++){
	      buf[k] = data[k]<0?(data[k]+256):(data[k]);
	    }
	    //十进制转化成十六进制
	    for(int k=0;k<buf.length;k++){
	      if(buf[k]<16) sb.append("0"+Integer.toHexString(buf[k]));
	      else sb.append(Integer.toHexString(buf[k]));
	    }
	    return "0x"+sb.toString().toUpperCase();
	  } 
	  public static byte[] concat(byte[] a, byte[] b, byte[] c) {  
//		  System.out.println(a.length);
//		  System.out.println(b.length);
//		  System.out.println(c.length);
		  byte[] d= new byte[a.length+b.length+c.length];  
		   System.arraycopy(a, 0, d, 0, a.length);  
		   System.arraycopy(b, 0, d, a.length, b.length); 
		   System.arraycopy(c, 0, d, a.length+b.length, c.length);   
		   return d;  
	  } 
	  
	  public static void conver(String srcPath, String destpath){
			byte[] data = image2byte(srcPath);
			byte[] fileHead;
			byte[] messageHead;
			byte[] endData;
	        fileHead = Arrays.copyOfRange(data, 0, 14);
	        fileHead[10] = 54;
	        messageHead = Arrays.copyOfRange(data, 14, 54);
	        messageHead[0] = 40;
	        endData = Arrays.copyOfRange(data, 58, data.length);
	        byte[] newData = concat(fileHead, messageHead, endData);
	        byte2image(newData, destpath);
	  }
	  
	  
	  public static void main(String[] args) {
		byte[] data = image2byte("C:\\Users\\hunter\\Desktop\\a.bmp");
		byte[] fileHead;
		byte[] messageHead;
		byte[] endData;
        fileHead = Arrays.copyOfRange(data, 0, 14);
        fileHead[10] = 54;
        messageHead = Arrays.copyOfRange(data, 14, 54);
        messageHead[0] = 40;
        endData = Arrays.copyOfRange(data, 58, data.length);
        byte[] newData = concat(fileHead, messageHead, endData);
        byte2image(newData, "C:\\Users\\hunter\\Desktop\\a.bmp");
	}
}

